﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using KPIS.GERP.Models.Class;
using KPIS.GERP.Models.ICM;
using Resources;

namespace KPIS.GERP.WEB.GIMS.Controllers
{
    public class DisposeController : Controller
    {
        private string[] _basicIncludeSubclass = new[]
		    {
				"CommitteeType", "CommitteePosition", "CommitteeFunction", "Employee.Position" 
		    };

        // 
        // GET: /Dispose/  ==> งานจำหน่ายพัสดุ > จำหน่าย

        #region Dispose

        public ActionResult Index()
        {
            var service = new DisposeService.DisposeServiceClient();
            var model = service.SelectDispose(new Dispose { RecordStatus = "!" + Models.SYS.RecordStatus.DeletedStatus }, new[] { "MasResourceType", "JobSite", "Warehouse", "DisposeType", "Employee" }).ToList().OrderByDescending( x=>x.DisposeId );

            if (model == null)
            {
                return HttpNotFound();
            }

            return View(model);
        }

        public ActionResult Details(int id)
        {
            ViewBag.DisposeId = id;
            return View();
        }

        public ActionResult Create()
        {
            return View(new Dispose());
        }

        [HttpPost, ValidateAntiForgeryToken]
        public ActionResult Create(Dispose model)
        {
            try
            {
                if (ModelState.IsValid)
                {
                    var service = new DisposeService.DisposeServiceClient();
                    service.Insert(model, Class.GimsMembership.CurrentEmpId);

                    return RedirectToAction("Index");
                }
                return View(model);
            }
            catch
            {
                return View();
            }
        }

        public ActionResult Edit(int id)
        {
            var service = new DisposeService.DisposeServiceClient();
            var item = service.SelectDispose(new Dispose { DisposeId = id }, new[] { "MasResourceType", "JobSite", "Warehouse", "DisposeType", "Employee" }).FirstOrDefault();

            if (item == null)
            {
                return HttpNotFound();
            }

            return View(item);
        }

        [HttpPost, ValidateAntiForgeryToken]
        public ActionResult Edit(Dispose model)
        {
            try
            {
                if (ModelState.IsValid)
                {
                    var service = new DisposeService.DisposeServiceClient();
                    service.Update(model, Class.GimsMembership.CurrentEmpId);
                    
                    return RedirectToAction("Index");
                }
                return Edit(model.DisposeId);
            }
            catch
            {
                return Edit(model.DisposeId);
            }
        }

        public ActionResult Delete(int id)
        {
            try
            {
                var service = new DisposeService.DisposeServiceClient();
                service.Delete(id, Class.GimsMembership.CurrentEmpId);

                return RedirectToAction("Index");
            }
            catch
            {
                return Index();
            }
        }

        [HttpPost, ValidateAntiForgeryToken]
        public ActionResult DeleteAll(int[] deleteIds)
        {
            try
            {
                if (deleteIds != null)
                {
                    var service = new DisposeService.DisposeServiceClient();

                    foreach (int delete in deleteIds)
                    {
                        service.Delete(delete, Class.GimsMembership.CurrentEmpId);
                    }
                }

                ModelState.AddModelError("Error", "ลบข้อมูลไปทั้งหมด " + deleteIds.Length.ToString("#,##0") + " รายการ");

                return Json(new { success = true });
            }
            catch
            {
                ModelState.AddModelError("Error", "พบข้อผิดพลาดขณะลบข้อมูล");
                return Json(new { success = false });
            }
        }

        #endregion 


        // เลือกรายการพัสดุที่ต้องการจำหน่ายครั้งละหนึ่งรายการ
        public ActionResult Select(int id, int DisposeId)
        {
            try
            {

                var service = new DisposeService.DisposeServiceClient();

                var modelDispose = service.SelectDispose(new Dispose 
                                   { RecordStatus = "!"+Models.SYS.RecordStatus.DeletedStatus,
                                     DisposeId = DisposeId 
                                   }, new[] { "MasResourceType", "JobSite", "Warehouse", "DisposeType", "Employee" }).FirstOrDefault();

                // ประเภทพัสดุ
                string ResourceType = modelDispose.MasResourceType.Name;

                // สถานที่ต้นทาง
                string Source = string.Empty;

                // สถานที่ปลายทาง
                string Destination = string.Empty;
                
                // เช็คว่าสถานที่ต้นทางมาจากที่ไหน เช่น มาจากคลัง หรือมาจากหน่วยงาน หรือมาจากสถานที่อื่นๆ
                if (modelDispose.FromIcmWhId != null)
                {
                    Source = modelDispose.Warehouse.Name;
                }
                else if (modelDispose.FromJobsiteId != null)
                {
                    Source = modelDispose.Jobsite.Name;
                }
                else if (modelDispose.FromOtherPlace != null)
                {
                    Source = modelDispose.FromOtherPlace;
                }

                // เช็คว่าสถานที่ปลายทางอยู่ที่ไหน เช่น อยู่ที่หน่วยงานอื่น หรืออยู่ที่สถานที่อื่นๆ
                if (modelDispose.ToOtherSite != null)
                {
                    Destination = modelDispose.ToOtherSite;
                }
                else if (modelDispose.ToOtherPlace != null)
                {
                    Destination = modelDispose.ToOtherPlace;
                }

                // เช็คประเภทพัสดุว่าเป็นวัสดุ หรือ ครุภัณฑ์
                // ถ้าเป็น "วัสดุ" ก็จะไป insert ตารางIcmDisposeOfficeSupplylotHistory
                // แต่ถ้าเป็น "ครุภัณฑ์" ก็จะไป insert ตาราง IcmMovementHistory
                if (ResourceType == "วัสดุ")
                {
                    DisposeOfficeSupplylotHistory modelDisposeOfficeSupplylotHistory = new DisposeOfficeSupplylotHistory();
                    modelDisposeOfficeSupplylotHistory.OfficeSuppliesLotId = id;
                    modelDisposeOfficeSupplylotHistory.DisposeId = DisposeId;
                    service.InsertDisposeOfficeSupplylotHistory(modelDisposeOfficeSupplylotHistory, Class.GimsMembership.CurrentEmpId);
                }
                else
                {
                    MovementHistory modelMMHistory = new MovementHistory();
                    modelMMHistory.AssetId = id;
                    modelMMHistory.MoveQty = 1;
                    modelMMHistory.SourceLocation = Source;
                    modelMMHistory.DestinationLocation = Destination;
                    modelMMHistory.MoveRefNo = DisposeId;
                    modelMMHistory.MovementType = "Dispose";    // Dispose คือการจำหน่ายพัสดุ
                    service.InsertMovementHistory(modelMMHistory, Class.GimsMembership.CurrentEmpId);
                }

                return RedirectToAction("Details", new { id = DisposeId });
            }
            catch
            {
                return Index();
            }
        }

        // เลือกรายการพัสดุที่ต้องการจำหน่ายครั้งละหลายรายการ เลือกโดยใช้ checkbox
        public ActionResult SelectAll(int[] selectIds, string hdDisposeId)
        {
            try
            {
                if (selectIds != null)
                {
                    int DisposeId = Convert.ToInt32(hdDisposeId);

                    var service = new DisposeService.DisposeServiceClient();

                    foreach (int select in selectIds)
                    {
                        var modelDispose = service.SelectDispose(new Dispose
                        {
                            RecordStatus = "!" + Models.SYS.RecordStatus.DeletedStatus,
                            DisposeId = DisposeId
                        }, new[] { "MasResourceType", "JobSite", "Warehouse", "DisposeType", "Employee" }).FirstOrDefault();

                        // ประเภทพัสดุ
                        string ResourceType = modelDispose.MasResourceType.Name;

                        // สถานที่ต้นทาง
                        string Source = string.Empty;

                        // สถานที่ปลายทาง
                        string Destination = string.Empty;

                        // เช็คว่าสถานที่ต้นทางมาจากที่ไหน เช่น มาจากคลัง หรือมาจากหน่วยงาน หรือมาจากสถานที่อื่นๆ
                        if (modelDispose.FromIcmWhId != null)
                        {
                            Source = modelDispose.Warehouse.Name;
                        }
                        else if (modelDispose.FromJobsiteId != null)
                        {
                            Source = modelDispose.Jobsite.Name;
                        }
                        else if (modelDispose.FromOtherPlace != null)
                        {
                            Source = modelDispose.FromOtherPlace;
                        }

                        // เช็คว่าสถานที่ปลายทางอยู่ที่ไหน เช่น อยู่ที่หน่วยงานอื่น หรืออยู่ที่สถานที่อื่นๆ
                        if (modelDispose.ToOtherSite != null)
                        {
                            Destination = modelDispose.ToOtherSite;
                        }
                        else if (modelDispose.ToOtherPlace != null)
                        {
                            Destination = modelDispose.ToOtherPlace;
                        }

                        // เช็คประเภทพัสดุว่าเป็นวัสดุ หรือ ครุภัณฑ์
                        // ถ้าเป็น "วัสดุ" ก็จะไป insert ตารางIcmDisposeOfficeSupplylotHistory
                        // แต่ถ้าเป็น "ครุภัณฑ์" ก็จะไป insert ตาราง IcmMovementHistory
                        if (ResourceType == "วัสดุ")
                        {
                            DisposeOfficeSupplylotHistory modelDisposeOfficeSupplylotHistory = new DisposeOfficeSupplylotHistory();
                            modelDisposeOfficeSupplylotHistory.OfficeSuppliesLotId = select;
                            modelDisposeOfficeSupplylotHistory.DisposeId = DisposeId;
                            service.InsertDisposeOfficeSupplylotHistory(modelDisposeOfficeSupplylotHistory, Class.GimsMembership.CurrentEmpId);
                        }
                        else
                        {
                            MovementHistory modelMMHistory = new MovementHistory();
                            modelMMHistory.AssetId = select;
                            modelMMHistory.MoveQty = 1;
                            modelMMHistory.SourceLocation = Source;
                            modelMMHistory.DestinationLocation = Destination;
                            modelMMHistory.MoveRefNo = DisposeId;
                            modelMMHistory.MovementType = "Dispose";    // Dispose คือการจำหน่ายพัสดุ
                            service.InsertMovementHistory(modelMMHistory, Class.GimsMembership.CurrentEmpId);
                        }
                        
                    }
                }

                ModelState.AddModelError("Error", "เลือกข้อมูลไปทั้งหมด " + selectIds.Length.ToString("#,##0") + " รายการ");

                return Json(new { success = true });
            }
            catch
            {
                ModelState.AddModelError("Error", "พบข้อผิดพลาดขณะเลือกข้อมูล");
                return Json(new { success = false });
            }
        }

        // ยกเลิกรายการพัสดุที่ต้องการจำหน่ายครั้งละหนึ่งรายการ
        public ActionResult UnSelect(int id, string ResourceType, int DisposeId)
        {
            try
            {

                var service = new DisposeService.DisposeServiceClient();
                service.UnSelect(id, ResourceType, Class.GimsMembership.CurrentEmpId);

                return RedirectToAction("Details", new { id = DisposeId });
            }
            catch
            {
                return RedirectToAction("Index");
            }
        }


        // คณะกรรมการ
        #region DisposeCommittee
        
        public ActionResult IndexDisposeCommittee(int DisposeId, bool EmptyLayout = false)
        {
            // Assume as CommitteeGroupId
            ViewBag.DisposeId = DisposeId;
            ViewBag.EmptyLayout = EmptyLayout;
            var service = new CommitteeService.CommitteeServiceClient();
            var model = service.Select(new Committee
            {
                CommitteeGroupId = DisposeId,
                ComFunctionId = 75,         // ComFunctionId = 75  >>>  75 คือ คณะกรรมการจำหน่ายพัสดุ
                RecordStatus = "!" + Models.SYS.RecordStatus.DeletedStatus
            }, _basicIncludeSubclass).ToList();

            if (model == null)
            {
                return HttpNotFound();
            }

            return View(model);
        }


        public ActionResult CommitteeDetails(int id)
        {
            var service = new CommitteeService.CommitteeServiceClient();
            var model = service.Select(new Committee { CommitteeId = id }, _basicIncludeSubclass).FirstOrDefault();
            return View(model);
        }

        public ActionResult CreateCommittee(int id)
        {
            var model = new Committee();
            model.CommitteeGroupId = id;
            // Reftype is obsolete
            // model.RefType = 22;
            model.ComTypeId = 8;
            return View(model);
        }

        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult CreateCommittee(Committee model, FormCollection collection)
        {
            try
            {
                if (ModelState.IsValid)
                {
                    var service = new CommitteeService.CommitteeServiceClient();
                    var id = service.Insert(model, Class.GimsMembership.CurrentEmpId);
                    return RedirectToAction("CommitteeDetails", new { id });
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return View(model);
        }

        public ActionResult EditCommittee(int id)
        {
            var service = new CommitteeService.CommitteeServiceClient();
            var model = service.Select(new Committee { CommitteeId = id }, _basicIncludeSubclass).FirstOrDefault();
            return View(model);
        }

        [HttpPost, ValidateAntiForgeryToken]
        public ActionResult EditCommittee(int id, Committee model)
        {
            try
            {
                if (ModelState.IsValid)
                {
                    var service = new CommitteeService.CommitteeServiceClient();
                    service.Update(model, Class.GimsMembership.CurrentEmpId);

                    return RedirectToAction("CommitteeDetails", new { id });
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return View(model);
        }

        public ActionResult DeleteCommittee(int id, int DisposeId)
        {
            try
            {
                var service = new CommitteeService.CommitteeServiceClient();
                service.Delete(id, Class.GimsMembership.CurrentEmpId);
                service.Close();
                return RedirectToAction("IndexCommitteeDispose", new { DisposeId });
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        [HttpPost, ValidateAntiForgeryToken]
        public ActionResult DeleteCommitteeAll(int[] deleteIds)
        {
            if (deleteIds == null)
                return Json(new { success = true });

            try
            {
                var service = new CommitteeService.CommitteeServiceClient();
                foreach (int delete in deleteIds)
                {
                    service.Delete(delete, Class.GimsMembership.CurrentEmpId);
                }

                ModelState.AddModelError(ErrorLocalization.Error, string.Format("ลบข้อมูลไปทั้งหมด {0} รายการ", deleteIds.Length.ToString("#,##0")));
                return Json(new { success = true });
            }
            catch (Exception ex)
            {
                ModelState.AddModelError(ErrorLocalization.Error, ErrorLocalization.ErrorWhileDeleteData);
                GerpLog.Error(ErrorLocalization.ErrorWhileDeleteData + ", " + ex.Message);
                return Json(new { success = false });
            }
        }

        public ActionResult GetEmployeeDetails(int id)
        {
            var service = new EmployeeService.EmployeeServiceClient();
            var result = service.Select(new Models.HRM.Employee() { EmpId = id }, new[] { "Position", "JobSite" }, null).FirstOrDefault();

            return Json(result, JsonRequestBehavior.AllowGet);
        }

        #endregion


        // อนุมัติ
        public ActionResult Approved(int DisposeId)
        {
            var service = new DisposeService.DisposeServiceClient();
            service.Approved(DisposeId, Class.GimsMembership.CurrentEmpId);
            return RedirectToAction("Index");
        }
    }
}
